Fix for bug #69586
authorKristian Rietveld <kris@gtk.org>
Sun, 27 Jan 2002 21:11:29 +0000 (21:11 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Sun, 27 Jan 2002 21:11:29 +0000 (21:11 +0000)
Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>

        Fix for bug #69586

        * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
        expander_size

        * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
        expander_size caching (from style), fix CELL_HEIGHT macro,
        use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
        row height calculation, added style_set callback

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtktreeprivate.h
gtk/gtktreeview.c

index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index c0a387a9d3488cb23a90faf2fde9185818f789d4..1b6796a30901c7f9c31d0159d39c7cdc2e8d5bb9 100644 (file)
@@ -1,3 +1,15 @@
+Sun Jan 27 22:13:02  Kristian Rietveld  <kris@gtk.org>
+
+       Fix for bug #69586
+
+       * gtk/gtktreeprivate.h: get rid of tab_offset, introduce
+       expander_size
+
+       * gtk/gtktreeview.c: get rid of ->priv->tab_offset, introduce
+       expander_size caching (from style), fix CELL_HEIGHT macro,
+       use MAX ("RBNODE_HEIGHT", expander_size) (differs per case) for
+       row height calculation, added style_set callback
+
 2002-01-27  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtklabel.c (gtk_label_create_window): Set the cursor to
index 19ca7f33a82e1d8f6b8cc8e28b6394b109b68d7d..f443c693998a45ce6de83d1cdef8e8d74d9470e0 100644 (file)
@@ -84,13 +84,13 @@ struct _GtkTreeViewPrivate
   /* tree information */
   GtkRBTree *tree;
 
-  gint tab_offset;
   GtkRBNode *button_pressed_node;
   GtkRBTree *button_pressed_tree;
 
   GList *children;
   gint width;
   gint height;
+  gint expander_size;
 
   GtkAdjustment *hadjustment;
   GtkAdjustment *vadjustment;
index ebcfa7e1bd1c0e2a31b13542035495f8bc9830bd..87d9729683f9ddd0bcb3a3f9b89fb56a7773ccdb 100644 (file)
@@ -53,7 +53,7 @@
  */
 
 #define BACKGROUND_HEIGHT(node) (GTK_RBNODE_GET_HEIGHT (node))
-#define CELL_HEIGHT(node, separator) (BACKGROUND_HEIGHT (node) - separator);
+#define CELL_HEIGHT(node, separator) ((BACKGROUND_HEIGHT (node)) - (separator))
 
 #define TREE_WINDOW_Y_TO_RBTREE_Y(tree_view,y) ((y) + tree_view->priv->dy)
 #define RBTREE_Y_TO_TREE_WINDOW_Y(tree_view,y) ((y) - tree_view->priv->dy)
@@ -170,6 +170,8 @@ static gint     gtk_tree_view_focus_out            (GtkWidget        *widget,
                                                    GdkEventFocus    *event);
 static gint     gtk_tree_view_focus                (GtkWidget        *widget,
                                                    GtkDirectionType  direction);
+static void     gtk_tree_view_style_set            (GtkWidget        *widget,
+                                                   GtkStyle         *previous_style);
 
 /* container signals */
 static void     gtk_tree_view_remove               (GtkContainer     *container,
@@ -474,6 +476,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   widget_class->drag_drop = gtk_tree_view_drag_drop;
   widget_class->drag_data_received = gtk_tree_view_drag_data_received;
   widget_class->focus = gtk_tree_view_focus;
+  widget_class->style_set = gtk_tree_view_style_set;
 
   /* GtkContainer signals */
   container_class->remove = gtk_tree_view_remove;
@@ -893,10 +896,8 @@ gtk_tree_view_init (GtkTreeView *tree_view)
   GTK_WIDGET_SET_FLAGS (tree_view, GTK_CAN_FOCUS);
 
   tree_view->priv->flags = GTK_TREE_VIEW_IS_LIST | GTK_TREE_VIEW_SHOW_EXPANDERS | GTK_TREE_VIEW_DRAW_KEYFOCUS | GTK_TREE_VIEW_HEADERS_VISIBLE;
-  gtk_widget_style_get (GTK_WIDGET (tree_view), "expander_size", &tree_view->priv->tab_offset, NULL);
 
   /* We need some padding */
-  tree_view->priv->tab_offset += EXPANDER_EXTRA_PADDING;
   tree_view->priv->dy = 0;
   tree_view->priv->n_columns = 0;
   tree_view->priv->header_height = 1;
@@ -1720,7 +1721,8 @@ gtk_tree_view_button_press (GtkWidget      *widget,
       path = _gtk_tree_view_find_path (tree_view, tree, node);
       depth = gtk_tree_path_get_depth (path);
       background_area.y = y_offset + event->y;
-      background_area.height = GTK_RBNODE_GET_HEIGHT (node);
+      background_area.height = MAX (GTK_RBNODE_GET_HEIGHT (node),
+                                   tree_view->priv->expander_size);
       background_area.x = 0;
 
       /* Let the column have a chance at selecting it. */
@@ -1748,8 +1750,8 @@ gtk_tree_view_button_press (GtkWidget      *widget,
          if (gtk_tree_view_is_expander_column (tree_view, column) &&
               TREE_VIEW_DRAW_EXPANDERS(tree_view))
            {
-             cell_area.x += depth*tree_view->priv->tab_offset;
-             cell_area.width -= depth*tree_view->priv->tab_offset;
+             cell_area.x += depth * tree_view->priv->expander_size;
+             cell_area.width -= depth * tree_view->priv->expander_size;
            }
          break;
        }
@@ -2028,7 +2030,7 @@ coords_are_over_arrow (GtkTreeView *tree_view,
 
   arrow.y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
 
-  arrow.height = BACKGROUND_HEIGHT (node);
+  arrow.height = MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size);
 
   gtk_tree_view_get_arrow_xrange (tree_view, tree, &arrow.x, &x2);
 
@@ -2207,13 +2209,8 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
       gint i, j = 1;
       GdkGC *gc;
       GdkColor col;
-      gint expander_size;
 
-      gtk_widget_style_get (widget,
-                           "expander_size", &expander_size,
-                           NULL);
-
-      width = expander_size;
+      width = tree_view->priv->expander_size;
 
       /* Get x, y, width, height of arrow */
       gdk_window_get_origin (tree_view->priv->header_window, &x, &y);
@@ -2227,8 +2224,8 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
          x += reorder->right_column->button->allocation.x - width/2;
          height = reorder->right_column->button->allocation.height;
        }
-      y -= expander_size/2; /* The arrow takes up only half the space */
-      height += expander_size;
+      y -= tree_view->priv->expander_size/2; /* The arrow takes up only half the space */
+      height += tree_view->priv->expander_size;
 
       /* Create the new window */
       if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW)
@@ -2281,13 +2278,8 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
       gint i, j = 1;
       GdkGC *gc;
       GdkColor col;
-      gint expander_size;
-
-      gtk_widget_style_get (widget,
-                           "expander_size", &expander_size,
-                           NULL);
 
-      width = expander_size;
+      width = tree_view->priv->expander_size;
 
       /* Get x, y, width, height of arrow */
       width = width/2; /* remember, the arrow only takes half the available width */
@@ -2300,8 +2292,8 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
       else
        height = reorder->right_column->button->allocation.height;
 
-      y -= expander_size;
-      height += 2*expander_size;
+      y -= tree_view->priv->expander_size;
+      height += 2*tree_view->priv->expander_size;
 
       /* Create the new window */
       if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT &&
@@ -2330,7 +2322,7 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
          /* Draw the 2 arrows as per above */
          col.pixel = 0;
          gdk_gc_set_foreground (gc, &col);
-         j = expander_size;
+         j = tree_view->priv->expander_size;
          for (i = 0; i < width; i ++)
            {
              gint k;
@@ -2339,8 +2331,8 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
              else
                k = i;
              gdk_draw_line (mask, gc, k, j, k, height - j);
-             gdk_draw_line (mask, gc, k, 0, k, expander_size - j);
-             gdk_draw_line (mask, gc, k, height, k, height - expander_size + j);
+             gdk_draw_line (mask, gc, k, 0, k, tree_view->priv->expander_size - j);
+             gdk_draw_line (mask, gc, k, height, k, height - tree_view->priv->expander_size + j);
              j--;
            }
          gdk_gc_destroy (gc);
@@ -2679,7 +2671,7 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
     {
       gboolean parity;
 
-      max_height = BACKGROUND_HEIGHT (node);
+      max_height = MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size);
 
       x_offset = -event->area.x;
       cell_offset = 0;
@@ -2797,8 +2789,8 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
          if (gtk_tree_view_is_expander_column (tree_view, column) &&
               TREE_VIEW_DRAW_EXPANDERS(tree_view))
            {
-             cell_area.x += depth*tree_view->priv->tab_offset;
-             cell_area.width -= depth*tree_view->priv->tab_offset;
+             cell_area.x += depth * tree_view->priv->expander_size;
+             cell_area.width -= depth * tree_view->priv->expander_size;
 
               /* If we have an expander column, the highlight underline
                * starts with that column, so that it indicates which
@@ -2881,7 +2873,7 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
                               widget,
                               "treeview-drop-indicator",
                               0, BACKGROUND_FIRST_PIXEL (tree_view, tree, node),
-                              width, BACKGROUND_HEIGHT (node));
+                              width, MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size));
 
               break;
             }
@@ -3162,7 +3154,6 @@ validate_row (GtkTreeView *tree_view,
   gint depth = gtk_tree_path_get_depth (path);
   gboolean retval = FALSE;
 
-
   /* double check the row needs validating */
   if (! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) &&
       ! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))
@@ -3192,9 +3183,12 @@ validate_row (GtkTreeView *tree_view,
                                          NULL, NULL, NULL,
                                          &tmp_width, &tmp_height);
       height = MAX (height, tmp_height);
+      height = MAX (height, tree_view->priv->expander_size);
 
       if (gtk_tree_view_is_expander_column (tree_view, column) && TREE_VIEW_DRAW_EXPANDERS (tree_view))
-       tmp_width = tmp_width + horizontal_separator + depth * tree_view->priv->tab_offset;
+        {
+         tmp_width = tmp_width + horizontal_separator + depth * (tree_view->priv->expander_size);
+       }
       else
        tmp_width = tmp_width + horizontal_separator;
 
@@ -3262,7 +3256,7 @@ validate_visible_area (GtkTreeView *tree_view)
          if (validate_row (tree_view, tree, node, &iter, path))
            size_changed = TRUE;
        }
-      height -= GTK_RBNODE_GET_HEIGHT (node);
+      height -= MAX (GTK_RBNODE_GET_HEIGHT (node), tree_view->priv->expander_size);
 
       if (node->children)
        {
@@ -4653,6 +4647,34 @@ gtk_tree_view_focus (GtkWidget        *widget,
   return TRUE;
 }
 
+static void
+gtk_tree_view_style_set (GtkWidget *widget,
+                        GtkStyle *previous_style)
+{
+  GtkTreeView *tree_view;
+  GList *list;
+  GtkTreeViewColumn *column;
+
+  g_return_if_fail (GTK_IS_TREE_VIEW (widget));
+
+  tree_view = GTK_TREE_VIEW (widget);
+
+  gtk_widget_style_get (widget,
+                       "expander_size", &tree_view->priv->expander_size,
+                       NULL);
+  tree_view->priv->expander_size += EXPANDER_EXTRA_PADDING;
+
+  for (list = tree_view->priv->columns; list; list = list->next)
+    {
+      column = list->data;
+      gtk_tree_view_column_cell_set_dirty (column);
+    }
+
+  _gtk_rbtree_mark_invalid (tree_view->priv->tree);
+
+  gtk_widget_queue_resize (widget);
+}
+
 
 static void
 gtk_tree_view_set_focus_child (GtkContainer *container,
@@ -5278,7 +5300,7 @@ gtk_tree_view_get_arrow_xrange (GtkTreeView *tree_view,
                        NULL);
 
   if (indent_expanders)
-    x_offset += tree_view->priv->tab_offset * _gtk_rbtree_get_depth (tree);
+    x_offset += tree_view->priv->expander_size * _gtk_rbtree_get_depth (tree);
 
   if (x1)
     *x1 = x_offset;
@@ -5287,7 +5309,7 @@ gtk_tree_view_get_arrow_xrange (GtkTreeView *tree_view,
     {
       /* +1 because x2 isn't included in the range. */
       if (x2)
-        *x2 = x_offset + tree_view->priv->tab_offset + 1;
+        *x2 = x_offset + tree_view->priv->expander_size + 1;
     }
   else
     {
@@ -5352,7 +5374,6 @@ gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
                        "horizontal_separator", &horizontal_separator,
                        NULL);
 
-
   if (height)
     *height = -1;
 
@@ -5388,7 +5409,7 @@ gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
       if (gtk_tree_view_is_expander_column (tree_view, column) &&
           TREE_VIEW_DRAW_EXPANDERS (tree_view))
        {
-         if (depth * tree_view->priv->tab_offset + horizontal_separator + width > column->requested_width)
+         if (depth * tree_view->priv->expander_size + horizontal_separator + width > column->requested_width)
            {
              gtk_tree_view_column_cell_set_dirty (column);
              retval = TRUE;
@@ -5462,22 +5483,25 @@ gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
                                  GtkRBNode   *node)
 {
   gint offset;
+  gint real_height;
 
   /* We process updates because we want to clear old selected items when we scroll.
    * if this is removed, we get a "selection streak" at the bottom. */
   if (GTK_WIDGET_REALIZED (tree_view))
     gdk_window_process_updates (tree_view->priv->bin_window, TRUE);
 
+  real_height = MAX (GTK_RBNODE_GET_HEIGHT (node), tree_view->priv->expander_size);
+
   offset = _gtk_rbtree_node_find_offset (tree, node);
 
   /* we reverse the order, b/c in the unusual case of the
    * node's height being taller then the visible area, we'd rather
    * have the node flush to the top
    */
-  if (offset + GTK_RBNODE_GET_HEIGHT (node) >
+  if (offset + real_height >
       tree_view->priv->vadjustment->value + tree_view->priv->vadjustment->page_size)
     gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment),
-                             offset + GTK_RBNODE_GET_HEIGHT (node) -
+                             offset + real_height -
                              tree_view->priv->vadjustment->page_size);
   if (offset < tree_view->priv->vadjustment->value)
     gtk_adjustment_set_value (GTK_ADJUSTMENT (tree_view->priv->vadjustment),
@@ -5923,10 +5947,10 @@ gtk_tree_view_queue_draw_arrow (GtkTreeView      *tree_view,
     return;
 
   rect.x = 0;
-  rect.width = MAX (tree_view->priv->tab_offset, GTK_WIDGET (tree_view)->allocation.width);
+  rect.width = MAX (tree_view->priv->expander_size, GTK_WIDGET (tree_view)->allocation.width);
 
   rect.y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
-  rect.height = BACKGROUND_HEIGHT (node);
+  rect.height = MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size);
 
   if (clip_rect)
     {
@@ -5957,7 +5981,7 @@ _gtk_tree_view_queue_draw_node (GtkTreeView  *tree_view,
   rect.width = MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width);
 
   rect.y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
-  rect.height = BACKGROUND_HEIGHT (node);
+  rect.height = MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size);
 
   if (clip_rect)
     {
@@ -6006,8 +6030,8 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
 
   gtk_widget_style_get (GTK_WIDGET (tree_view),
                        "vertical_separator", &vertical_separator,
-                       "expander_size", &expander_size,
                        NULL);
+  expander_size = tree_view->priv->expander_size - EXPANDER_EXTRA_PADDING;
 
   if (! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT))
     return;
@@ -6019,7 +6043,7 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
   area.x = x_offset;
   area.y = CELL_FIRST_PIXEL (tree_view, tree, node, vertical_separator);
   area.width = expander_size + 2;
-  area.height = CELL_HEIGHT (node, vertical_separator);
+  area.height = MAX (CELL_HEIGHT (node, vertical_separator), (expander_size - vertical_separator));
 
   if (node == tree_view->priv->button_pressed_node)
     {
@@ -8513,14 +8537,15 @@ gtk_tree_view_get_cell_area (GtkTreeView        *tree_view,
        return;
 
       rect->y = CELL_FIRST_PIXEL (tree_view, tree, node, vertical_separator);
-      rect->height = CELL_HEIGHT (node, vertical_separator);
+      rect->height = MAX (CELL_HEIGHT (node, vertical_separator), tree_view->priv->expander_size - vertical_separator);
 
       if (gtk_tree_view_is_expander_column (tree_view, column) &&
          TREE_VIEW_DRAW_EXPANDERS (tree_view))
        {
          gint depth = gtk_tree_path_get_depth (path) - 1;
-         rect->x += depth * tree_view->priv->tab_offset;
-         rect->width -= depth * tree_view->priv->tab_offset;
+
+         rect->x += depth * tree_view->priv->expander_size;
+         rect->width -= depth * tree_view->priv->expander_size;
          rect->width = MAX (rect->width, 0);
        }
     }
@@ -8573,7 +8598,7 @@ gtk_tree_view_get_background_area (GtkTreeView        *tree_view,
 
       rect->y = BACKGROUND_FIRST_PIXEL (tree_view, tree, node);
 
-      rect->height = BACKGROUND_HEIGHT (node);
+      rect->height = MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size);
     }
 
   if (column)
@@ -8972,7 +8997,7 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
   cell_offset = x;
 
   background_area.y = y;
-  background_area.height = BACKGROUND_HEIGHT (node);
+  background_area.height = MAX (BACKGROUND_HEIGHT (node), tree_view->priv->expander_size);
 
   gdk_drawable_get_size (tree_view->priv->bin_window,
                          &bin_window_width, NULL);
@@ -9026,8 +9051,8 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
       if (gtk_tree_view_is_expander_column (tree_view, column) &&
           TREE_VIEW_DRAW_EXPANDERS(tree_view))
         {
-          cell_area.x += depth * tree_view->priv->tab_offset;
-          cell_area.width -= depth * tree_view->priv->tab_offset;
+          cell_area.x += depth * tree_view->priv->expander_size;
+          cell_area.width -= depth * tree_view->priv->expander_size;
         }
 
       if (gtk_tree_view_column_cell_is_visible (column))